package com.cjx.print.helper;

import android.graphics.Bitmap;
import android.graphics.Color;
import android.text.TextUtils;

import com.cjx.print.App;
import com.cjx.print.entity.OrderGoodsEntity;
import com.cjx.print.interfaces.Callback;
import com.cjx.print.utils.LogUtil;
import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.QRCodeWriter;

import net.posprinter.IDeviceConnection;
import net.posprinter.POSConnect;
import net.posprinter.TSPLConst;
import net.posprinter.TSPLPrinter;

import java.util.ArrayList;
import java.util.Hashtable;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * create by cjx on 2024/8/17
 * desc: 芯烨打印机
 */
public class XYPrinterHelperOld {

    private IDeviceConnection tagDevice;
    private TSPLPrinter tsplPrinter;
    private Callback<Boolean> connectCallback;

    private static final class HelperHolder {
        static final XYPrinterHelperOld helper = new XYPrinterHelperOld();
    }

    public static XYPrinterHelperOld getInstance() {
        return HelperHolder.helper;
    }

    private XYPrinterHelperOld() {
        POSConnect.init(App.app);
    }

    public void connectUSB(String address, Callback<Boolean> connectCallback) {
        this.connectCallback = connectCallback;
        connectDevice(address, POSConnect.DEVICE_TYPE_USB);
    }

    public void connectBluetooth(String address, Callback<Boolean> connectCallback) {
        this.connectCallback = connectCallback;
        connectDevice(address, POSConnect.DEVICE_TYPE_BLUETOOTH);
    }

    /**
     * @param address
     * @param type    DEVICE_TYPE_USB, DEVICE_TYPE_BLUETOOTH, DEVICE_TYPE_ETHERNET, DEVICE_TYPE_SERIAL(/dev/ttyS4,38400)
     */
    private void connectDevice(final String address, final int type) {
        tagDevice = POSConnect.createDevice(type);
        tagDevice.connect(address, (code, connectInfo, message) -> {
            if (code == POSConnect.CONNECT_SUCCESS) {
                tsplPrinter = new TSPLPrinter(tagDevice)
                        .sizeMm(39, 30)
                        .gapMm(2, 2)
                        .reference(0, 0)
                        .density(7)
                        .direction(TSPLConst.DIRECTION_REVERSE);
                log("device connect success");
                if (connectCallback != null) {
                    connectCallback.callback(true);
                }
            } else if (code == POSConnect.CONNECT_FAIL) {
                log("device connect fail");
                if (connectCallback != null) {
                    connectCallback.callback(false);
                }
            }
        });
    }

    public List<String> getUsbDevices() {
        return POSConnect.getUsbDevices(App.app);
    }

    public void closeDevice() {
        if (tagDevice != null) {
            tagDevice.close();
            tagDevice = null;
            tsplPrinter = null;
        }
    }

    private final int WIDTH = 285;

    // 打印订单
    // 打印范围
    // x ： 0 - 285
    // y ： 10 - 230
    // 中文高度占24，宽度占24
    public void printOrderLabel(String time, ArrayList<OrderGoodsEntity> goodsList) {
        for (OrderGoodsEntity goods : goodsList) {
            int chineseNameLength = countChineseCharactersWithRegex(goods.getGoodsName());
            int charNameLength = goods.getGoodsName().length() - chineseNameLength;

            int chineseSpecLength = countChineseCharactersWithRegex(goods.getSpecName());
            int charSpecLength = goods.getSpecName().length() - chineseSpecLength;
            Bitmap qrcodeBitmap = createQRCodeBitmap(goods.getQrCode(), 138, 138, null,
                    "H", "0", Color.BLACK, Color.WHITE);
            tsplPrinter.cls(); // 清空缓冲区
            int x1 = (WIDTH - chineseNameLength * 24 + charNameLength * 12) / 2;
            int x2 = (WIDTH - chineseSpecLength * 24 - charSpecLength * 12) / 2;
            int x3 = (WIDTH - time.length() * 12) / 2;

            tsplPrinter
                    .text(x1, 10, TSPLConst.FNT_SIMPLIFIED_CHINESE, goods.getGoodsName())
                    .text(x2, 44, TSPLConst.FNT_SIMPLIFIED_CHINESE, goods.getSpecName())
                    .text(x3, 212, TSPLConst.FNT_SIMPLIFIED_CHINESE, time);
            if (qrcodeBitmap != null) {
                tsplPrinter.bitmap(74, 74, TSPLConst.BMP_MODE_OVERWRITE, 138, qrcodeBitmap);
            }
            tsplPrinter.print();
        }
    }

    // 中文个数
    private int countChineseCharactersWithRegex(String str) {
        if (str == null || str.isEmpty()) {
            return 0;
        }
        // 匹配中文字符的正则表达式
        String regex = "[\\u4e00-\\u9fa5]";
        Pattern pattern = Pattern.compile(regex);
        Matcher matcher = pattern.matcher(str);
        int count = 0;
        while (matcher.find()) {
            count++;
        }
        return count;
    }

    private void log(String message) {
        LogUtil.getInstance().log("PRINT", message);
    }


    /**
     * 生成简单二维码
     *
     * @param content                字符串内容
     * @param width                  二维码宽度
     * @param height                 二维码高度
     * @param character_set          编码方式（一般使用UTF-8）
     * @param error_correction_level 容错率 L：7% M：15% Q：25% H：35%
     * @param margin                 空白边距（二维码与边框的空白区域）
     * @param color_black            黑色色块
     * @param color_white            白色色块
     * @return BitMap
     */
    public Bitmap createQRCodeBitmap(String content, int width, int height,
                                     String character_set, String error_correction_level,
                                     String margin, int color_black, int color_white) {
        // 字符串内容判空
        if (TextUtils.isEmpty(content)) {
            return null;
        }
        // 宽和高>=0
        if (width < 0 || height < 0) {
            return null;
        }
        try {
            /** 1.设置二维码相关配置 */
            Hashtable<EncodeHintType, String> hints = new Hashtable<>();
            // 字符转码格式设置
            if (!TextUtils.isEmpty(character_set)) {
                hints.put(EncodeHintType.CHARACTER_SET, character_set);
            }
            // 容错率设置
            if (!TextUtils.isEmpty(error_correction_level)) {
                hints.put(EncodeHintType.ERROR_CORRECTION, error_correction_level);
            }
            // 空白边距设置
            if (!TextUtils.isEmpty(margin)) {
                hints.put(EncodeHintType.MARGIN, margin);
            }
            /** 2.将配置参数传入到QRCodeWriter的encode方法生成BitMatrix(位矩阵)对象 */
            BitMatrix bitMatrix = new QRCodeWriter().encode(content, BarcodeFormat.QR_CODE, width, height, hints);

            /** 3.创建像素数组,并根据BitMatrix(位矩阵)对象为数组元素赋颜色值 */
            int[] pixels = new int[width * height];
            for (int y = 0; y < height; y++) {
                for (int x = 0; x < width; x++) {
                    //bitMatrix.get(x,y)方法返回true是黑色色块，false是白色色块
                    if (bitMatrix.get(x, y)) {
                        pixels[y * width + x] = color_black;//黑色色块像素设置
                    } else {
                        pixels[y * width + x] = color_white;// 白色色块像素设置
                    }
                }
            }
            /** 4.创建Bitmap对象,根据像素数组设置Bitmap每个像素点的颜色值,并返回Bitmap对象 */
            Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
            bitmap.setPixels(pixels, 0, width, 0, 0, width, height);
            return bitmap;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

}
